package com.ruoyi.common.enums;

import com.ruoyi.common.core.domain.entity.SysUser;
import lombok.Getter;

/**
 * 数据范围类型
 * code 与库表 data_scope 对应；label 用于审计展示；
 * 提供基于用户与表别名构建过滤SQL的能力。
 */
@Getter
public enum DataScopeType {
    ALL(1, "全部"),
    DEPT_AND_CHILD(2, "本部门及下级"),
    DEPT_ONLY(3, "本部门"),
    SELF_ONLY(4, "仅本人"),
    CUSTOM(5, "自定义");

    @Getter
    private final Integer code;
    private final String label;

    DataScopeType(Integer code, String label) {
        this.code = code;
        this.label = label;
    }

    public static DataScopeType fromCode(Integer code) {
        if (code == null) return null;
        for (DataScopeType t : values()) {
            if (t.code == code) return t;
        }
        return null;
    }

    /**
     * 基于当前类型构建过滤SQL（返回可直接拼到 WHERE 的条件段）
     */
    public String buildFilterSql(String tableAlias, SysUser user, String scopeExpr) {
        if (this == ALL) {
            return null;
        }
        if (tableAlias == null || tableAlias.isEmpty() || user == null) {
            return null;
        }
        switch (this) {
            case DEPT_AND_CHILD:
                return tableAlias + ".dept_id IN (SELECT dept_id FROM sys_dept WHERE dept_id = "
                        + user.getDeptId() + " OR FIND_IN_SET(" + user.getDeptId() + ", ancestors))";
            case DEPT_ONLY:
                return tableAlias + ".dept_id = " + user.getDeptId();
            case SELF_ONLY:
                return tableAlias + ".user_id = " + user.getUserId();
            case CUSTOM:
                return scopeExpr; // 上层保证 data_scope=5 时提供有效的表达式
            default:
                return null;
        }
    }
} 